package com.xiaomaoguai.spring.aop.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Random;

/**
 * 基于jdk的动态代理,缺点是: 使用内置的Proxy实现动态代理有一个问题：被代理的类必须实现接口，未实现接口则没办法完成动态代理。
 *
 * @fileName: DynamicProxy.java
 * @author: WeiHui.Zhang
 * @date: 2016-11-10  10:10
 * @version: v1.0.0
 */
public class DynamicProxy implements InvocationHandler {

	/**
	 * 被代理的对象
	 */
	private Object targetObject;

	/**
	 * 获得被代理后的对象
	 *
	 * @return
	 */
	public Object getProxyObject(Object object) {
		this.targetObject = object;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
	}

	/**
	 * 调用的时候
	 *
	 * @param proxy
	 * @param method
	 * @param args
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//被织入的内容，开始时间
		long start = System.currentTimeMillis();
		System.out.println(start);
		lazy();
		Object result = method.invoke(targetObject, args);
		long span = System.currentTimeMillis() - start;
		System.out.println("共用时：" + span);
		return result;
	}

	//模拟延时
	public void lazy() {
		try {
			int n = new Random().nextInt(500);
			Thread.sleep(n);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
